﻿#ifndef CHANNEL_H
#define CHANNEL_H

#include <functional>
#include <cstdint>

class EventLoop;
// 对于一个描述符进行监控事件管理
class Channel
{
private:
    // 所属的eventloop
    EventLoop *m_eloop;
    // 描述符
    int m_fd;
    // 事件
    uint32_t m_events;
    // 就绪事件
    uint32_t m_revents;
    // 回调函数
    using EventCallback = std::function<void()>;
    EventCallback m_read_callback;             // 读回调
    EventCallback m_write_callback;            // 写回调
    EventCallback m_error_callback;            // 错误回调
    EventCallback m_close_callback;            // 关闭回调
    EventCallback m_any_callback;              // 任意回调

public:
    Channel(EventLoop *eloop, int fd);
    ~Channel();
    // 获取描述符
    int getFd() const;
    // 获取事件
    uint32_t getEvents() const;
    // 获取就绪事件
    uint32_t getRevents() const;

    // 设置就绪事件
    void setRevents(uint32_t revents);

    // 是否可读
    bool isReadAble() const;
    // 是否可写
    bool isWriteAble() const;
    // 添加可读监控
    void enableRead();
    // 添加可写监控
    void enableWrite();
    // 关闭可读监控
    void disableRead();
    // 关闭可写监控
    void disableWrite();
    // 关闭所有监控
    void disableAll();

    // 移除监控
    void remove();
    // 更新监控
    void update();
    // 设置回调函数
    void setReadCallback(const EventCallback &callback);
    void setWriteCallback(const EventCallback &callback);
    void setErrorCallback(const EventCallback &callback);
    void setCloseCallback(const EventCallback &callback);
    void setAnyCallback(const EventCallback &callback);
    // 处理事件
    void handleEvent();
};

#endif
